package cn.pink.gamesrv.account;

import cn.pink.common.proto.Msg;
import cn.pink.common.proto.MsgIds;
import cn.pink.core.CallPoint;
import cn.pink.core.config.IronConfig;
import cn.pink.core.support.observer.MsgObserver;
import cn.pink.gamesrv.msg.MsgParamAccount;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;

/**
 * 账号消息处理
 * @Author: pink
 * @Date: 2022/6/30 17:47
 */
public class AccountMsgHandler {
    /** 下属监听消息 */
    public static final Set<Integer> protos = new HashSet<>();

    static {
        // 寻找本类监听的消息
        Method[] mths = AccountMsgHandler.class.getMethods();
        for (Method m : mths) {
            // 不是监听函数的忽略
            if (!m.isAnnotationPresent(MsgObserver.class)) {
                continue;
            }
            // 记录
            MsgObserver ann = m.getAnnotation(MsgObserver.class);
            protos.add(ann.value()[0]);
        }
    }

    /**
     * 客户端登录 2种情况
     * 1.带角色登录+排队
     * 2.不带角色登录+不排队
     */
    @MsgObserver(MsgIds.CSLOGIN)
    public static void onCSLogin(MsgParamAccount param) {
        Msg.CSLogin msg = param.getMsg();
        CallPoint sessionPoint = param.getSessionPoint();
        AccountService service = param.getService();

        // 渠道ID
        String channelId = StringUtils.trim(msg.getChannelId().toLowerCase());
        // 用户标识 第三方账号 这里是中台sdk的openid
        String userIdentity = msg.getUserIdentity();
        // token 这里应该为空
        String token = msg.getToken();

        //TODO 区分正式和测试环境 验证token

        // 账号信息
        AccountObject accountObj = new AccountObject();
        accountObj.setSessionPoint(sessionPoint);
        accountObj.setChannelId(channelId);
        accountObj.setUserIdentity(userIdentity);
        accountObj.setDeviceId(msg.getDeviceId());
        accountObj.setToken(msg.getToken());

        if(IronConfig.GAME_LOGIN_ROLE) {
            //TODO 使用角色登录, 加到登录排队中
        }
        else {
            AccountManager.roleLogin(accountObj, userIdentity, service);
        }
    }
}
